home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / Src / Ch16 / GZGrid.cls < prev    next >
Text File  |  1999-06-29  |  6KB  |  176 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "GZOrderGrid3d"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. Private xmin As Single      ' Min X and Y values.
  17. Private zmin As Single
  18. Private dx As Single        ' Spacing between rows of data.
  19. Private dz As Single
  20. Private NumX As Integer     ' Number of X and Y entries.
  21. Private NumZ As Integer
  22. Private Points() As Point3D     ' Data values.
  23. Private Normals() As Point3D    ' Vertex normals.
  24.  
  25. Public RemoveHidden As Boolean
  26.  
  27. Private Type POINTAPI
  28.     X As Long
  29.     Y As Long
  30. End Type
  31. Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
  32. Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
  33. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  34. Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
  35. Private Const ALTERNATE = 1
  36. Private Declare Function GetRgnBox Lib "gdi32" (ByVal hRgn As Long, lpRect As RECT) As Long
  37. Private Type RECT
  38.     Left As Long
  39.     Top As Long
  40.     Right As Long
  41.     Bottom As Long
  42. End Type
  43.  
  44. ' Diffuse reflection coefficients.
  45. Public DiffuseKr As Single
  46. Public DiffuseKg As Single
  47. Public DiffuseKb As Single
  48.  
  49. ' Ambient light coefficients.
  50. Public AmbientKr As Single
  51. Public AmbientKg As Single
  52. Public AmbientKb As Single
  53.  
  54. ' Specular reflection coefficients.
  55. Public SpecularK As Single
  56. Public SpecularN As Single
  57. ' Create the Points array.
  58. Public Sub SetBounds(ByVal x1 As Single, ByVal deltax As Single, ByVal xnum As Integer, ByVal z1 As Single, ByVal deltaz As Single, ByVal znum As Integer)
  59. Dim i As Integer
  60. Dim j As Integer
  61. Dim X As Single
  62. Dim Z As Single
  63.  
  64.     xmin = x1
  65.     zmin = z1
  66.     dx = deltax
  67.     dz = deltaz
  68.     NumX = xnum
  69.     NumZ = znum
  70.     ReDim Points(1 To NumX, 1 To NumZ)
  71.     ReDim Normals(1 To NumX, 1 To NumZ)
  72.  
  73.     X = xmin
  74.     For i = 1 To NumX
  75.         Z = zmin
  76.         For j = 1 To NumZ
  77.             With Points(i, j)
  78.                 .coord(1) = X
  79.                 .coord(2) = 0
  80.                 .coord(3) = Z
  81.                 .coord(4) = 1#
  82.             End With
  83.             With Normals(i, j)
  84.                 .coord(1) = 0
  85.                 .coord(2) = -1
  86.                 .coord(3) = 0
  87.                 .coord(4) = 1#
  88.             End With
  89.             Z = Z + dz
  90.         Next j
  91.         X = X + dx
  92.     Next i
  93. End Sub
  94. ' Save the indicated data value.
  95. Public Sub SetValue(ByVal X As Single, ByVal Y As Single, ByVal Z As Single)
  96. Dim i As Integer
  97. Dim j As Integer
  98.  
  99.     i = (X - xmin) / dx + 1
  100.     j = (Z - zmin) / dz + 1
  101.     Points(i, j).coord(2) = Y
  102. End Sub
  103. ' Save the indicated vertex normal value.
  104. Public Sub SetNormal(ByVal X As Single, ByVal Z As Single, ByVal Nx As Single, ByVal Ny As Single, ByVal Nz As Single)
  105. Dim i As Integer
  106. Dim j As Integer
  107. Dim Length As Single
  108.  
  109.     Length = Sqr(Nx * Nx + Ny * Ny + Nz * Nz)
  110.     i = (X - xmin) / dx + 1
  111.     j = (Z - zmin) / dz + 1
  112.     With Normals(i, j)
  113.         .coord(1) = Nx / Length
  114.         .coord(2) = Ny / Length
  115.         .coord(3) = Nz / Length
  116.     End With
  117. End Sub
  118. ' Apply a transformation matrix which may not
  119. ' contain 0, 0, 0, 1 in the last column to the
  120. ' object.
  121. Public Sub ApplyFull(M() As Single)
  122. Dim i As Integer
  123. Dim j As Integer
  124.  
  125.     For i = 1 To NumX
  126.         For j = 1 To NumZ
  127.             m3ApplyFull Points(i, j).coord, M, Points(i, j).trans
  128.             m3ApplyFull Normals(i, j).coord, M, Normals(i, j).trans
  129.         Next j
  130.     Next i
  131. End Sub
  132.  
  133. ' Apply a transformation matrix to the object.
  134. Public Sub Apply(M() As Single)
  135. Dim i As Integer
  136. Dim j As Integer
  137.  
  138.     For i = 1 To NumX
  139.         For j = 1 To NumZ
  140.             m3Apply Points(i, j).coord, M, Points(i, j).trans
  141.             m3ApplyFull Normals(i, j).coord, M, Normals(i, j).trans
  142.         Next j
  143.     Next i
  144. End Sub
  145.  
  146.  
  147. ' Draw the transformed points on a PictureBox.
  148. Public Sub Draw(ByVal pic As Object, ByVal light_sources As Collection, ByVal ambient_light As Integer, ByVal eye_x As Single, ByVal eye_y As Single, ByVal eye_z As Single)
  149. Dim i As Integer
  150. Dim j As Integer
  151.  
  152.     ' Draw the "rectangles."
  153.     For i = 1 To NumX - 1
  154.         For j = 1 To NumZ - 1
  155.             GouraudQuadrilateral pic, _
  156.                 light_sources, ambient_light, _
  157.                 eye_x, eye_y, eye_z, _
  158.                 DiffuseKr, DiffuseKg, DiffuseKb, _
  159.                 AmbientKr, AmbientKg, AmbientKb, _
  160.                 SpecularK, SpecularN, _
  161.                 Points(i, j).coord(1), Points(i, j).coord(2), Points(i, j).coord(3), _
  162.                 Points(i, j + 1).coord(1), Points(i, j + 1).coord(2), Points(i, j + 1).coord(3), _
  163.                 Points(i + 1, j + 1).coord(1), Points(i + 1, j + 1).coord(2), Points(i + 1, j + 1).coord(3), _
  164.                 Points(i + 1, j).coord(1), Points(i + 1, j).coord(2), Points(i + 1, j).coord(3), _
  165.                 Normals(i, j).coord(1), Normals(i, j).coord(2), Normals(i, j).coord(3), _
  166.                 Normals(i, j + 1).coord(1), Normals(i, j + 1).coord(2), Normals(i, j + 1).coord(3), _
  167.                 Normals(i + 1, j + 1).coord(1), Normals(i + 1, j + 1).coord(2), Normals(i + 1, j + 1).coord(3), _
  168.                 Normals(i + 1, j).coord(1), Normals(i + 1, j).coord(2), Normals(i + 1, j).coord(3), _
  169.                 Points(i, j).trans(1), Points(i, j).trans(2), _
  170.                 Points(i, j + 1).trans(1), Points(i, j + 1).trans(2), _
  171.                 Points(i + 1, j + 1).trans(1), Points(i + 1, j + 1).trans(2), _
  172.                 Points(i + 1, j).trans(1), Points(i + 1, j).trans(2)
  173.         Next j
  174.     Next i
  175. End Sub
  176.